package com.vhall.component.controller.inav.facade;


import com.alibaba.fastjson.JSONObject;
import com.vhall.component.entity.inav.vo.*;
import com.vhall.component.entity.room.vo.ReportGuideShownRequestVO;
import com.vhall.component.plugin.common.annotation.TokenAuth;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;

import java.util.List;

/**
 * @author lsl
 * @date 2021/6/7
 */
@FeignClient(value = "InavApiFacade", path = "/v4/api/inav")
public interface InavApiFacade {

    /**
     * 获取房间互动信息
     * <br/>同时判断用户是否可以加入直播间 - 观看限制
     * <br/>同时判断用户是否可以加入直播间- 并发限制
     *
     * @param reqVO 请求参数
     * @return 返回值
     */
    @PostMapping(value = "/get")
    InavRespVO get(@Validated GetInavVO reqVO);

    /**
     * 禁言/取消禁言
     *
     * @param reqVO 请求参数
     * @return 返回参数
     */
    @PostMapping("/set-banned")
    Integer setBanned(@Validated SetBannedReqVO reqVO);

    /**
     * 踢出/取消踢出用户
     *
     * @param reqVO 请求参数
     */
    @PostMapping("/set-kicked")
    Boolean setKicked(@Validated SetKickedReqVO reqVO);

    /**
     * 获取在线成员列表
     *
     * @param reqVO 参数
     * @return 列表信息
     */
    @PostMapping("/get-online-list")
    GetOnlineListRspVO getOnlineList(@Validated GetOnlineListReqVO reqVO);

    /**
     * 获取特殊用户列表（嘉宾/助理等）
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping("/get-user-list")
    List<GetUserListRspVO> getUserList(@Validated GetUserListReqVO reqVO);

    /**
     * 获得用户状态 (android)
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/get-user-status")
    UserStatusRspVO getUserStatus(@Validated GetUserStatusReqVO reqVO);


    /**
     * 设置用户演示状态（主画面）
     *
     * @param reqVO 请求参数
     * @return 返回结果
     */
    @PostMapping(value = "/set-main-screen")
    Boolean setMainScreen(@Validated SetMainScreenReqVO reqVO);

    /**
     * 设置设备状态
     *
     * @param reqVO 参数
     */
    @PostMapping(value = "/set-device-status")
    Boolean setDeviceStatus(@Validated SetDeviceStatusReqVO reqVO);


    /**
     * 互动设置设备检测
     *
     * @param reqVO 请求参数
     * @return rsp 响应结果
     */
    @PostMapping("/set-device")
    Boolean setDevice(@Validated SetDeviceReqVO reqVO);


    /**
     * 主持人邀请用户上麦
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/invite")
    Boolean invite(@Validated InviteReqVO reqVO);

    /**
     * 上麦
     *
     * @param reqVO 参数
     * @return 返回结果
     */
    @PostMapping(value = "/speak")
    Boolean speak(@Validated SpeakReqVO reqVO);

    /**
     * 下麦
     *
     * @param reqVO 参数
     * @return 返回结果
     */
    @PostMapping(value = "/nospeak")
    Boolean noSpeak(@Validated NoSpeakReqVO reqVO);

    /**
     * 用户取消申请上麦
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/cancel-apply")
    Boolean cancelApply(@Validated CancelApplyReqVO reqVO);

    /**
     * 申请上麦
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/apply")
    Boolean apply(@Validated ApplyReqVO reqVO);

    /**
     * 用户同意上麦邀请
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/agree-invite")
    Boolean agreeInvite(@Validated InviteReqVO reqVO);

    /**
     * 用户拒绝上麦邀请
     *
     * @param reqVO 参数
     * @return 返回值
     */
    @PostMapping(value = "/reject-invite")
    Boolean rejectInvite(@Validated InviteReqVO reqVO);

    /**
     * 获取踢出用户列表
     *
     * @param reqVO 请求参数
     * @return 返回踢出用户列表
     */
    @PostMapping(value = "/get-kicked-list")
    BannedAndKickedListRspVO getKickedList(@Validated BannedKickedReqVO reqVO);

    /**
     * 获取禁言列表
     *
     * @param reqVO 请求参数
     * @return 返回禁言列表
     */
    @PostMapping(value = "/get-banned-list")
    BannedAndKickedListRspVO getBannedList(@Validated BannedKickedReqVO reqVO);

    /**
     * 获取禁言列表
     *
     * @param reqVO 请求参数
     * @return 返回禁言列表
     */
    @PostMapping(value = "/list-banned-kicked")
    BannedAndKickedListRspVO listBannedKicked(@Validated BannedKickedReqVO reqVO);

    /**
     * 同意用户上麦申请
     *
     * @param reqVO 参数
     * @return 返回结果
     */
    @PostMapping(value = "/agree-apply")
    Boolean agreeApply(@Validated AgreeApplyReqVO reqVO);

    /**
     * 拒绝上麦申请
     *
     * @param reqVO 参数
     * @return 返回结果
     */
    @PostMapping(value = "/reject-apply")
    Boolean rejectApply(@Validated RejectApplyReqVO reqVO);

    /**
     * 互动设置上麦接口
     *
     * @param reqVO 请求参数
     * @return 响应结果
     */
    @PostMapping(value = "/set-handsup")
    Boolean setHandSup(@Validated SetHandSupReqVO reqVO);

    /**
     * 互动设置上麦接口
     *
     * @param reqVO 请求参数
     * @return 响应结果
     */
    @PostMapping(value = "/anchor-info")
    AnchorInfoVO anchorInfo(@Validated AnchorInfoReqVO reqVO);

    /**
     * 预下麦
     * 客户端在下麦接口之前调用，发送一个广播消息通知用户正在下麦的状态
     * 若收到了自己的这个预下麦消息，则开始下麦操作
     *
     * @param reqVO 请求参数
     * @return 返回值
     * @author yuanzh
     * @date 2021/9/15
     */
    @PostMapping(value = "/pre-break-speak")
    JSONObject preBreakSpeak(@Validated PreBreakSpeakReqVO reqVO);

    /**
     * 无法上麦
     *
     * @param reqVO 请求参数
     * @return 返回值
     * @author yuanzh
     * @date 2021/9/15
     */
    @PostMapping(value = "/unable-speak")
    JSONObject unableSpeak(@Validated UnableSpeakReqVO reqVO);

    /**
     * 用户弹出引导信息获取
     * @param requestVO
     * @return
     */
    @PostMapping(value = "/user-guide-info")
    @TokenAuth
    UserGuideInfoResponseVO getUserGuideInfo(@Validated UserGuideInfoRequestVO requestVO);
    /**
     * 观众关注投顾接口
     * @param vo
     * @return
     */
    @TokenAuth
    @PostMapping(value = "/follow-investment-advisor")
    Boolean followGuoxinZone(@Validated FollowGuoxinZoneRequestVO vo);
    /**
     * 投顾 ip/栏目关注/订阅的引导上报
     * 用于进行房间今天已经弹出了引导弹窗标记
     * @param vo
     * @return
     */
    @TokenAuth
    @PostMapping(value = "/report-guide-shown")
    Boolean reportGuideShown(@Validated ReportGuideShownRequestVO vo);
}
